package com.yuan.algorithms.competition;

/*
Problem Description
当今世界，网络已经无处不在了，小度熊由于犯了错误，当上了度度公司的网络管理员，他手上有大量的 IP列表，小度熊想知道在某个固定的子网掩码下，有多少个网络地址。网络地址等于子网掩码与 IP 地址按位进行与运算后的结果，例如：

子网掩码：A.B.C.D

IP 地址：a.b.c.d

网络地址：(A&a).(B&b).(C&c).(D&d)

Input
第一行包含一个整数TT，(1 \leq T \leq 50)(1≤T≤50)代表测试数据的组数，

接下来TT组测试数据。每组测试数据包含若干行，

第一行两个正整数N(1 \leq N \leq 1000, 1 \leq M \leq 50),MN(1≤N≤1000,1≤M≤50),M。接下来NN行，每行一个字符串，代表一个 IP 地址，

再接下来MM行，每行一个字符串代表子网掩码。IP 地址和子网掩码均采用 A.B.C.DA.B.C.D的形式，其中A,B,C,DA,B,C,D均为非负整数，且小于等于255。

Output
对于每组测试数据，输出两行：

第一行输出: "Case #i:" 。ii代表第ii组测试数据。

第二行输出测试数据的结果，对于每组数据中的每一个子网掩码，输出在此子网掩码下的网络地址的数量。

Sample Input
2
5 2
192.168.1.0
192.168.1.101
192.168.2.5
192.168.2.7
202.14.27.235
255.255.255.0
255.255.0.0
4 2
127.127.0.1
10.134.52.0
127.0.10.1
10.134.0.2
235.235.0.0
1.57.16.0
Sample Output
Case #1:
3
2
Case #2:
3
4
 */


import java.util.Scanner;
import java.util.TreeSet;

/**
 * @author YouYuan
 * @contact 1265161633@qq.com
 * @date 2016年5月12日 下午9:50:26
 * @descript 
 */
public class 百度之星_IP聚合 {

	static Scanner in = new Scanner(System.in);

	public static void main(String[] args) {
		int t = in.nextInt();
		for (int i = 1; i <= t; i++) {
			int n = in.nextInt();
			int m = in.nextInt();
			String[] ip = new String[n];
			String[] subnet = new String[m];
			for (int j = 0; j < n; j++) {
				ip[j] = in.next();
			}
			for (int j = 0; j < m; j++) {
				subnet[j] = in.next();
			}
			System.out.println("Case #" + i + ":");
			for (int j = 0; j < subnet.length; j++) {
				System.out.println(ipGroupNum(ip, subnet[j]));
			}
		}
		/*long s = System.currentTimeMillis();
		String[] ip = new String[5000];
		String[] subnet = new String[50];
		int k = 0;
		for (int i = 0; i < ip.length; i++) {
			String tip = "192.168.3.";

			tip += k % 256;

			k++;
			ip[i] = tip;
		}
		k = 0;
		for (int i = 0; i < subnet.length; i++) {
			String tip = "255.255.255.255";
//			tip += k % 256;
//			k++;
			subnet[i] = tip;
		}
		for (int j = 0; j < subnet.length; j++) {
			System.out.println(ipGroupNum(ip, subnet[j]));
		}
		long e = System.currentTimeMillis();
		System.out.println("-----Time:"+(e-s));*/
	}
	private static int ipGroupNum(String[] ip, String subnet) {
		TreeSet<String> set = new TreeSet<String>();
		for (int i = 0; i < ip.length; i++) {
			String[] ips = ip[i].split("\\.");
			String[] subnets = subnet.split("\\.");
			String temp = "";
			for (int j = 0; j < ips.length; j++) {
				temp += (Integer.parseInt(ips[j]) & Integer.parseInt(subnets[j])) + ".";
			}
			set.add(temp);
		}
		return set.size();
	}

}
